package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import fachlogik.Eintrag;
import fachlogik.Item;
import fachlogik.LagerException;

public class JdbcLager implements Item
{

	private Connection connection;
	public JdbcLager() throws LagerException
	{
		getConnection();
	}
	
	private Connection getConnection() throws LagerException
	{
		try
		{
			if (connection == null || connection.isClosed())
			{
				String driver = "com.mysql.jdbc.Driver";
				String url = "jdbc:mysql://localhost/lager_barger";
				String user = "root";
				String pwd = "";
				
				Class.forName(driver);
				connection = DriverManager.getConnection(url, user, pwd);
				
			}
			
		}
		catch (SQLException e)
		{
			throw new LagerException("Fehler beim Verbinden zur Datenbank", e);
		} catch (ClassNotFoundException e)
		{
			throw new LagerException("DB-Treiber nicht gefunden", e);
		}
		return connection;
		
	}
	
	@Override
	public void speichern(Item i) throws LagerException
	{

	}

	@Override
	public void speichern(Eintrag e) throws LagerException
	{
		// TODO Auto-generated method stub
		if ( e.getId() == 0)
			insert(e);
		else
			update(e);
	}
	private void insert(Eintrag e) throws LagerException
	{
		String sql ="INSERT INTO eintraege (name,beschreibung,kuerzel,lagerort,stueckzahl) VALUES (?,?,?,?,?)";
		
		try(PreparedStatement pstmt = connection.prepareStatement(sql,java.sql.Statement.RETURN_GENERATED_KEYS))
		{
			pstmt.setString(1, e.getName());
			pstmt.setString(2, e.getBeschreibung());
			pstmt.setString(3,e.getKuerzel());
			pstmt.setString(4, e.getLagerort());
			pstmt.setInt(5,e.getStueckzahl());
			
			pstmt.executeUpdate();
			ResultSet generated = pstmt.getGeneratedKeys();
			if(generated.next()) e.setId(generated.getInt(1));
		}
		catch (SQLException e1) {
			// TODO Auto-generated catch block
			throw new LagerException("Fehler beim Speichern des Eintrags: "+e.getName(),e1);
		}
	}
	
	private void update (Eintrag e) throws LagerException
	{
		String sql ="UPDATE eintraege SET name =? ,beschreibung =? ,kuerzel =?,lagerort=?,stueckzahl=? WHERE id =?";
		try (PreparedStatement pstmt = connection.prepareStatement(sql,java.sql.Statement.RETURN_GENERATED_KEYS))
		{
			pstmt.setString(1, e.getName());
			pstmt.setString(2,e.getBeschreibung());
			pstmt.setString(3,e.getKuerzel());
			pstmt.setString(4, e.getLagerort());
			pstmt.setInt(5,e.getStueckzahl());
			pstmt.setInt(6, e.getId());
			pstmt.executeUpdate();
		}
		catch (SQLException e1) {
			// TODO Auto-generated catch block
			throw new LagerException("Fehler beim Aktualisierung des Eintrags: "+e.getName(),e1);
		}
	}
	
	@Override
	public void entfernen(Item i) throws LagerException
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public void entfernen(Eintrag e) throws LagerException
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<Eintrag> suchen(String suchtext) throws LagerException
	{
		List<Eintrag> eintraege = new ArrayList<>();
		String sql = "SELECT id,name,beschreibung,kuerzel,lagerort,stueckzahl FROM eintraege";
		
		try (PreparedStatement pstmt = connection.prepareStatement(sql))
		{
			ResultSet rs= pstmt.executeQuery();
			while(rs.next())
			{
				Eintrag eintrag = new Eintrag();
				eintrag.setBeschreibung(rs.getString("beschreibung"));
				eintrag.setId(rs.getInt("id"));
				eintrag.setKuerzel(rs.getString("kuerzel"));
				eintrag.setLagerort(rs.getString("lagerort"));
				eintrag.setName(rs.getString("name"));
				eintrag.setStueckzahl(rs.getInt("stueckzahl"));
				eintraege.add(eintrag);
				
			}
		}
		
		
		catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new LagerException("Fehler beim Suchen",e);
		}
		suchtext = suchtext.trim().toLowerCase();
		if (suchtext == null || suchtext.isEmpty())
			return new ArrayList<>(eintraege);
			
		List<Eintrag> gefunden = new ArrayList<>();
		
		for (Eintrag e : eintraege)
		{
			if (e.getBeschreibung().toLowerCase().contains(suchtext)
					|| e.getName().toLowerCase().contains(suchtext)
					|| e.getKuerzel().toLowerCase().contains(suchtext)
					|| e.getLagerort().toLowerCase().contains(suchtext))
				gefunden.add(e);
			
		}
		return gefunden;
	}

	
}
